package com.adams.custom.page.core.dao.impl;

import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.log4j.Logger;

import com.adams.access.db.bean.DicElement;
import com.adams.access.db.dao.hibernate.HibernateGenericDao;
import com.adams.core.exception.BusinessException;
import com.adams.custom.page.util.ViewCacheUtil;

/**
 * 
 * File Name : DicElementDaoImpl.java
 * 
 * @Description : 数据项定义数据访问实现类
 */
public class DicElementDaoImpl extends HibernateGenericDao<DicElement, String>
{
	Logger logger = Logger.getLogger(DicElementDaoImpl.class.getName());

	private static String cacheMap_key = "DicElement_cacheMap";

	private static String cacheMapByTablecode_key = "DicElement_cacheMapByTablecode";

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.adams.access.db.dao.hibernate.HibernateGenericDao#save(java
	 * .lang.Object)
	 */
	// public void save(DicElement model)
	// {
	// super.save(model);
	// }
	/**
	 * Description : 根据elementcode获得数据项定义
	 * 
	 * @param elementcode
	 * @return
	 * @throws Exception
	 * 
	 */
	@SuppressWarnings("unchecked")
	public DicElement getDicElement(String elementcode)
			throws BusinessException
	{
		Map cacheMap = ViewCacheUtil.getConfigDataCacheMap(cacheMap_key);
		if (!cacheMap.containsKey(elementcode))
		{
			synchronizationCache();
		}
		DicElement result = (DicElement) cacheMap.get(elementcode);
		if (null == result)
		{
			logger.error(elementcode + "数据项定义不存在！");
			throw new BusinessException("element.config.notexists.exception");
		}
		return result;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.adams.access.db.dao.hibernate.HibernateGenericDao#delete(java
	 * .lang.Object)
	 */
	// public void delete(DicElement model)
	// {
	// super.delete(model);
	// }
	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.adams.access.db.dao.hibernate.HibernateGenericDao#saveOrUpdate
	 * (java.lang.Object)
	 */
	// public void saveOrUpdate(DicElement model)
	// {
	// super.saveOrUpdate(model);
	// }
	/**
	 * Description : 查询所有的数据项定义
	 * 
	 * @return
	 * 
	 */
	// @SuppressWarnings("unchecked")
	// public List<DicElement> findAll()
	// {
	// List<DicElement> result = null;
	// Map cacheMap = ViewCacheUtil.getCacheMap(cacheMap_key);
	// if (cacheMap.size() == 0)
	// {
	// result = synchronizationCache();
	// return result;
	// } else
	// {
	// result = new ArrayList<DicElement>();
	// Set keySet = cacheMap.keySet();
	// for (Iterator it = keySet.iterator(); it.hasNext();)
	// {
	// Object key = it.next();
	// DicElement temp = (DicElement) cacheMap.get(key);
	// if (null != temp)
	// {
	// result.add(temp);
	// }
	// }
	// }
	// return result;
	// }
	/**
	 * Description : 根据表编码查询字段定义
	 * 
	 * @param tablecode
	 * @return
	 * 
	 */
	// @SuppressWarnings("unchecked")
	// public List<DicElement> findByTablecode(String tablecode)
	// {
	// Map cacheMapByTablecode = ViewCacheUtil
	// .getCacheMap(cacheMapByTablecode_key);
	// if (!cacheMapByTablecode.containsKey(tablecode))
	// {
	// synchronizationCache();
	// }
	// List<DicElement> result = new ArrayList<DicElement>();
	// Set<DicElement> temp = (Set<DicElement>) cacheMapByTablecode
	// .get(tablecode);
	// if (null != temp)
	// {
	// result.addAll(temp);
	// Collections.sort(result, new Comparator<DicElement>()
	// {
	// @Override
	// public int compare(DicElement o1, DicElement o2)
	// {
	// // TODO Auto-generated method stub
	// return o1.getElementcode().compareTo(o2.getElementcode());
	// }
	//
	// });
	// }
	// return result;
	// }
	private List<DicElement> findAllFromDB()
	{
		List<DicElement> result = query("from DicElement");
		return result;
	}

	/**
	 * Description : 同步缓存
	 * 
	 * @return
	 * 
	 */
	@SuppressWarnings("unchecked")
	public synchronized List<DicElement> synchronizationCache()
	{
		List<DicElement> result = findAllFromDB();
		Map cacheMap = ViewCacheUtil.getConfigDataCacheMap(cacheMap_key);
		Map cacheMapByTablecode = ViewCacheUtil
				.getConfigDataCacheMap(cacheMapByTablecode_key);
		cacheMapByTablecode.clear();
		for (DicElement dicElement : result)
		{
			cacheMap.put(dicElement.getElementcode(), dicElement);

			String tablecode = dicElement.getTablecode();
			Set<DicElement> set = null;
			if (cacheMapByTablecode.containsKey(tablecode))
			{
				set = (Set<DicElement>) cacheMapByTablecode.get(tablecode);
			} else
			{
				set = new HashSet<DicElement>();
			}
			set.add(dicElement);
			cacheMapByTablecode.put(tablecode, set);
		}
		ViewCacheUtil.put2ConfigDataCacheMap(cacheMap_key, cacheMap);
		ViewCacheUtil.put2ConfigDataCacheMap(cacheMapByTablecode_key,
				cacheMapByTablecode);
		return result;
	}
}
